#ifndef MULTICASTRECEIVER_H
#define MULTICASTRECEIVER_H

#include "common.h"
#include "DataProcessor.h"

#include <QObject>
#include <string>

/**
 * @class MulticastReceiver
 * @brief 负责接收组播消息的类
 *
 * 此类用于初始化接收套接字，加入组播组，并在独立线程中接收数据。
 * 接收到的数据通过信号传递给 DataProcessor 进行处理。
 */
class MulticastReceiver : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param groupAddr 组播地址
     * @param groupPort 组播端口号
     * @param interface 本地网络接口名称
     * @param parent 父对象
     */
    MulticastReceiver(const std::string& groupAddr, u16 groupPort, const std::string& interface, QObject* parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~MulticastReceiver();

    /**
     * @brief 开始接收数据
     * @return 是否成功启动接收
     */
    bool startReceiving();

signals:
    /**
     * @brief 数据接收完成信号
     * @param data 接收到的数据
     */
    void dataReceived(const std::string& data);

private slots:
    /**
     * @brief 数据接收线程的主函数
     */
    void processReceivedData();

private:
    /**
     * @brief 初始化套接字
     * @return 是否成功初始化
     */
    bool initSocket();

    /**
     * @brief 加入组播组
     * @return 是否成功加入
     */
    bool joinMulticastGroup();

    /**
     * @brief 离开组播组
     * @return 是否成功离开
     */
    bool leaveMulticastGroup();

private:
    s32            sockfd_;         ///< 套接字描述符
    std::string    groupAddr_;      ///< 组播地址
    u16            groupPort_;      ///< 组播端口号
    std::string    interface_;      ///< 本地网卡接口名称
};
#endif // MULTICASTRECEIVER_H
